在昨天的文章中我整理了一些重用 Ansible 內容的方法,但有時候,我們要完成一項任務可能不單單只需要 task,還需要一些其他的設定、檔案之類的。在這種情況下,Ansible 提供了另外一個機制,稱為 role,來幫助我們可以把各種內容打包成一個 role 來使用。
根據目前的官方文件,role 是透過資料夾來定義的,底下預設會有這八個資料夾,但只要有至少一個就行。
<role_name>/
tasks/
handlers/
library/
files/
templates/
vars/
defaults/
meta/
預設情況下,Ansible 會在每個資料夾底下搜尋 main.yml
(或是 main
、main.yaml
)來決定這個 role 的內容。
Ansible 除了可以把東西打包成 Role 以外,還可以把它發布到網路上,供其他需要的人下載。在 Python 的世界,我們可以透過 pip 來安裝套件,而在 Ansible,這就要透過 Ansible Galaxy 來達成了。
舉例來說,若我要安裝 geerlingguy.docker 這個在 host 上安裝 docker 的 role 的話,只要透過以下命令,就能在我的 managed node 上面安裝了。
ansible-galaxy install geerlingguy.docker
話說在 galaxy 上面搜尋的話,應該還會看到另一個名詞 --- collection。若我的理解沒錯,這是在比較新一些的版本新增的一種發布 Ansible 內容的方式,底下可以包含 plugin、module、playbook 或是 role 等資源。
安裝好 role 之後,我們該如何使用它呢?總共有三種方法:
roles
:在 play 底下有個 roles
的參數,只要給他一個 array 包含這份 play 需要使用的 role,就可以執行他們了。import_role
/ include_role
:在 task 底下我們也可以透過這兩個 module 來靜態或是動態的引入 role。今天就是最後一天了,老實說沒有什麼結束的感覺。這三十天下來都是過得戰戰兢兢,每天都在嘗試學習新的東西,不過還是有很多東西要學呀...本來還想說可以多談談有關可觀測性或是 log 的部分(這些也是我認為長期以來 NOJ 中存在的問題),無奈於時間與經驗不足,希望這一年能夠有時間好好把他們補完。